// 文件发送方
// usage: ./hw5_send "1.txt"

#include <my_header.h>
#include <arpa/inet.h> 

#define BUFF_SIZE 3000

// 读写文件缓冲
char buf[BUFF_SIZE];

int main(int argc, char *argv[]){
    // 检查命令行传入参数数量
    ARGS_CHECK(argc, 2);
    
    // 提取待传输文件的文件名
    char file_name[20] = {0};
    strncpy(file_name, argv[1], sizeof(file_name)-1);
    file_name[sizeof(file_name)-1] = '\0';
    // 记录文件名长度：双方约定用32位无符号数保存文件名长度
    uint32_t name_len = strlen(file_name); 

    // 打开待传输的文件
    int file_fd = open(file_name, O_RDONLY);
    ERROR_CHECK(file_fd, -1, file_name);

    // 打开管道写端
    int w_fd = open("1.pipe", O_WRONLY);
    ERROR_CHECK(w_fd, -1, "open 1.pipe");

    /*-------------------使用管道传输文件-------------------*/
    printf("文件传输中......\n");
    // 1、向管道中传输文件名长度
    uint32_t name_len_net = htonl(name_len); // 主机序 -> 网络序
    write(w_fd, &name_len_net, sizeof(name_len_net));

    // 2、向管道中传输文件名
    write(w_fd, file_name, name_len);

    // 3、向管道中传输文件的内容
    int count = 0;
    while((count = read(file_fd, buf, sizeof(buf))) > 0){
        write(w_fd, buf, count);
    }
    printf("文件传输结束。\n");
    /*-------------------使用管道传输文件-------------------*/

    // 关闭文件描述符
    close(w_fd);
    close(file_fd);

    return 0;
}